package service;

import org.sqlite.SQLiteDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-06-30
 * Time: 21:23
 */
public class DBUtil {
    // 使用到单例模式创建 DataSource
    // volatile 防止指令重排序, 在拿到 DataSource 时没有构造好
    private static volatile DataSource dataSource = null;

    // 懒汉单例模式
    // 此时线程多线程时可能出现多个实例
    public static DataSource getDataSource() {
        // 判断是否加锁
        if (dataSource == null) {
            // 判断是否创建实例
            synchronized (DBUtil.class) {
                if (dataSource == null) {
                    dataSource = new SQLiteDataSource();
                    // 采用绝对路径 ./
                    ((SQLiteDataSource) dataSource).setUrl("jdbc:sqlite:./fileSearch.db");
                }
            }
        }
        return dataSource;
    }

    // 建立连接
    public static Connection getConnection() throws SQLException {
        return getDataSource().getConnection();
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) {

        // 从后向前关闭资源
        // 单个独立释放, 防止其中一个异常导致其他资源不释放
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
